#include <bits/stdc++.h>

using namespace std;

struct node{
	string func;
	vector<int>father,son,in;
	int cnt;//记录入度 
	int val;//记录器件的执行结果 
};

vector<node>vec;
vector<int>execute_order;	//执行流

void execute(int input[])		//run with input
{
	for(int i=0;i<execute_order.size();i++){
		int index=execute_order[i];
		// cout<<"###excuteorder="<<index<<endl;
		vector<int>a;
	 	for(int j=0;j<vec[index].father.size();j++){
			int tmp=vec[index].father[j];
			a.push_back(vec[tmp].val);
		}
		for(int j=0;j<vec[index].in.size();j++){
			int tmp=vec[index].in[j];
			a.push_back(input[tmp-1]);
		}
		int ret=a[0],size=a.size();
		if(vec[index].func=="NOT") {
			ret=!a[0];
		}
		else if(vec[index].func=="AND") {
			for(int i=1;i<a.size();i++){
				ret=ret&a[i];
			}
		}
		else if(vec[index].func=="OR") 
		{
			for(int i=1;i<a.size();i++){
				ret=ret|a[i];
			}
		}
		else if(vec[index].func=="XOR") 
		{
			for(int i=1;i<size;i++){
				ret=ret^a[i];
			}
		}
		else if(vec[index].func=="NAND") 
		{
			for(int i=1;i<a.size();i++){
				ret=ret&a[i];
			}
			ret=!ret;
		}
		else if(vec[index].func=="NOR") 
		{
			for(int i=1;i<a.size();i++){
				ret=ret|a[i];
			}
			ret=!ret;
		}
		vec[index].val=ret;
	}
} 

int check(){
	queue<int>Q;
	int size=vec.size();
	for(int i=1;i<size;i++)		//选择入度为0的器件 
	{
		if(!vec[i].cnt){
			Q.push(i);
		}
	}
	execute_order.clear();
	int cnt=1;
	while(!Q.empty()){
		int index=Q.front();
		Q.pop();
		++cnt;
		execute_order.push_back(index);		//更新执行流 
		int cnt=vec[index].son.size();
		for(int i=0;i<cnt;++i){
			int v=vec[index].son[i];
			if(!(--vec[v].cnt))Q.push(v);
		}
	}
	
	return size==cnt;
}

int to_num(char *s){
	int ret=0;
	int i=1;
	while(s[i]!='\0'){
		ret=ret*10+(s[i]-'0');
		i++;
	}
	return ret;
}

int main(){
	int q;
	scanf("%d",&q);
	for(int i=0;i<q;i++){
		
		int m,n,k;
		char L[10];
		scanf("%d %d",&m,&n);
		vec.clear();
		vec.resize(n+1);
		for(int j=1;j<=n;j++)	//处理第一部分的输入 
		{
			cin>>vec[j].func;
			scanf("%d",&k);
			for(int x=0;x<k;x++){
				scanf("%s",L);
				int num=to_num(L);
				if(L[0]=='I'){
					vec[j].in.push_back(num);//in记录输入信号序列 
				}
				else	//father记录上一级器件序列（有输入的） 
				{
					vec[j].father.push_back(num);
					vec[num].son.push_back(j);	//son记录下一级器件序列，作用是方便检查和建立执行流 
				}
			}
			vec[j].cnt=vec[j].father.size();	//cnt记录此器件的入度 
		}
		
		/*处理第二部分输入*/
		/*input记录输入，NeedOutput记录要求输出结果的器件*/		
		int s,in;
		scanf("%d",&s);
		int input[s][m];
		int NeedOutput[s][m+1];
		for(int j=0;j<s;j++){
			for(int x=0;x<m;x++){
				scanf("%d",&input[j][x]);
			}
		}
		for(int j=0;j<s;j++){
			int si,index;
			scanf("%d",&si); 
			for(int x=0;x<si;x++){
				scanf("%d",&index);
				NeedOutput[j][x]=index;
			}
			NeedOutput[j][si]=-1;	//标志位，识别序列的终点 
		}
		if(!check())	//check的同时建立执行流，执行流是器件execute的顺序 
		{
			printf("LOOP");
		}else{
			for(int j=0;j<s;j++){
				execute(input[j]); //根据输入执行组合逻辑电路 
				for(int x=0;NeedOutput[j][x]!=-1;x++){
					int index=NeedOutput[j][x];
					printf("%d",vec[index].val);
					if(NeedOutput[j][x+1]!=-1)printf(" ");
				} 
				if(j!=s-1)printf("\n"); 
			}
			
		}
		if(i!=q-1)printf("\n");
	}
	return 0;
} 
